#include "paquete.h"
#include "stdlib.h"
#include "string.h"

int procesar_paquete_entrante(paquete **entrante, cola_mensaje **cola){
  if(*entrante!=0 && (*entrante)->size==(*entrante)->progreso){
    cola_encolar(cola, (*entrante)->datos + sizeof(int), (*entrante)->size - sizeof(int));
    paquete_destruir(entrante);
  }
  return 0;
}

int procesar_paquete_saliente(paquete **saliente, cola_mensaje **cola){
  if(*saliente==0){
    if(cola_hay_datos(*cola)){
      *saliente = malloc(sizeof(paquete));
      void *datos;
      int size_mensaje;
      cola_ver_primero(*cola, &datos, &size_mensaje);
      (*saliente)->progreso=0;
      (*saliente)->datos = malloc(size_mensaje + sizeof(int));
      (*saliente)->size = size_mensaje + sizeof(int);
      memcpy((*saliente)->datos, &(*saliente)->size, sizeof(int));
      memcpy((*saliente)->datos + sizeof(int), datos, size_mensaje);
      cola_desencolar(cola);
    }
  }
  return 0;
}

int paquete_destruir(paquete **p){
  if(*p!=0){
    free((*p)->datos);
    free(*p);
    *p=0;
  }
}

/* FUNCIONES PARA WRITE*/
int paquete_saliente_a_socket_preparar(paquete **saliente, void **datos, int *size){
  if(*saliente!=0){
    *datos = (*saliente)->datos + (*saliente)->progreso;
    *size = (*saliente)->size - (*saliente)->progreso;
  }else{
    *size = 0;
    *datos = 0;
  }
}

int paquete_saliente_a_socket_resultado(paquete **saliente, int enviados){
  (*saliente)->progreso += enviados;
  if((*saliente)->progreso==(*saliente)->size)
    paquete_destruir(saliente);
}

/*FUNCIONES PARA READ*/
int paquete_entrante_que_pedir(paquete **entrante, void **datos, int *size){
  if(*entrante==0){
    *entrante=malloc(sizeof(paquete));
    (*entrante)->datos=malloc(sizeof(int));
    (*entrante)->size=-1;
    (*entrante)->progreso=0;
  }
  if( (*entrante)->size == -1)
    *size = sizeof(int) - (*entrante)->progreso;
  else
    *size = (*entrante)->size - (*entrante)->progreso;
  *datos = (*entrante)->datos + (*entrante)->progreso;
}

int paquete_entrante_mas_datos(paquete **entrante, int recibidos){
  (*entrante)->progreso +=recibidos;
  if( (*entrante)->size== -1){
    if((*entrante)->progreso == sizeof(int)){
      int size = *((int*)(*entrante)->datos);
      (*entrante)->datos=realloc((*entrante)->datos, size);
      (*entrante)->size=size;
    }
  }
}


